package com.atguigu.springbootmq.config;


import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.CustomExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.HashMap;
import java.util.Map;

@Configuration //实例化
/**
 * @Configuration 用于定义配置类，可替换XML配置文件，被注解的类内部包含一个
 * 或多个@Bean注解方法。可以被AnnotationConfigApplicationContext或者
 * AnnotationConfigWebApplicationContext 进行扫描。用于构建bean定义以及初始化
 * Spring容器
 *
 */
public class DelayedQueueConfig {


    //队列
    public static final String DELAYED_QUEUE_NAME = "delayed.queue";
    //交换机
    public static final String DELAYED_EXCHANGE_NAME = "delayed.exchange";
    //routinKey
    public static final String DELAYED_ROUTING_KEY = "delayed.routingkey";



    //队列
    @Bean("delayedQueue")
    public Queue delayedQueue(){
        return new Queue(DELAYED_QUEUE_NAME);
    };


    //声明交换机
    @Bean("delayedExchange")
    /**
     * 我们都在微博上@过某某，对方会优先看到这条信息，并给你反馈，那么在Spring中，你
     * 标识一个@符号，那么Spring就会来看看，并且从这里拿到一个Bean或者给出一个Bean
     *
     * Java面向对象，对象有方法和属性，那么就需要对象实例来调用方法和属性（即实例化）；
     *凡是有方法或属性的类都需要实例化，这样才能具象化去使用这些方法和属性；
     */

    public CustomExchange delayedExchange(){

        Map<String, Object> arguments = new HashMap<>();
        arguments.put("x-delayed-type","direct");//直接类型
/**
 * 1.交换机的名称，名字
 * 2.交换机的类型
 * 3.是否需要持久化
 *4.是否需要自动删除
 * 5.其他的参数
 */
        return new CustomExchange(DELAYED_EXCHANGE_NAME,"x-delayed-message",
                true,false,arguments);

    }


    //绑定 队列和交换机
    @Bean
    public Binding delayedQueueBindingDelayedExchange(
            @Qualifier("delayedQueue") Queue delayedQueue,
            @Qualifier("delayedExchange") CustomExchange delayedExchange
    ){

        return BindingBuilder.bind(delayedQueue).to(delayedExchange).with(DELAYED_ROUTING_KEY).noargs();
    }

}
